iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
Software Development

小青蛇變大蟒蛇——進階Python學起來!系列 第 10

Python 與浮點數(float):一些小介紹

  • 分享至 

  • xImage
  •  

今天我們來認識 Python 中的浮點數,以及如何處理它們。

先來看一下浮點數 float class 的說明:

help(float)
Help on class float in module builtins:

class float(object)
 |  float(x=0, /)
 |  
 |  Convert a string or number to a floating point number, if possible.
 |  

float只有一個引數,可以傳數字也可以是字串:

print(float(10))
10.0
print(float('3.14'))
3.14

不過字串如果是分數就無法轉換:

float('22/7')
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

/Users/maotingyang/Downloads/Floats - Internal Representation.ipynb Cell 8 in <cell line: 1>()
----> <a href='vscode-notebook-cell:/Users/maotingyang/Downloads/Floats%20-%20Internal%20Representation.ipynb#X11sZmlsZQ%3D%3D?line=0'>1</a> float('22/7')


ValueError: could not convert string to float: '22/7'

如果想轉換分數,可以用昨天學到的 Fraction 類型, 再傳給 float 處理:

from fractions import Fraction
float(Fraction('22/7'))
3.142857142857143

浮點數並非總是「精準』

我們印出浮點數 0.1 來觀察一下:

print(0.1)
0.1

乍看之下很正常,但如果我們多看幾個小數點後面位數:

format(0.1, '.25f')
'0.1000000000000000055511151'

為什麼會這樣?因為電腦其實只會二進制,我們看到的十進位 0.1 其實背後是二進制的逼近:

https://ithelp.ithome.com.tw/upload/images/20220922/20151657o3Yr77D6sP.jpg

如上圖,加越多 2 冪次項越準,但記憶體有限,不可能無窮項加下去,最終結果總會比 0.1 大一點點,或小一點點。

實際運用上這會有什麼問題呢?有些浮點數運算結果可能跟你想的不一樣:

a = 0.3

print(a == 0.2 + 0.1)
False

不過有些浮點數是可以被精確表示的,就是那些 2^-n 次方的小數:

a = Fraction(1,8)
print(float(a))
format(float(a), '.25f')
0.125





'0.1250000000000000000000000'

好啦,接下來幾天都要在浮點數打轉,我們明天見~~~

參考:Python 3: Deep Dive (Part 1 - Functional)


上一篇
Python 與有理數(rational numbers)
下一篇
Python 與浮點數(float):比較浮點數
系列文
小青蛇變大蟒蛇——進階Python學起來!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言